package com.itheima.reggie.controller;

import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;

/**
 * @author ：石破天
 * @date ：Created in 2022年12月21日
 * @description ：
 * @version: 1.0
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {
    // 从怎么从配置文件中读数据
    @Value("${reggie.path}")
    private String basePath;

    /**
     * 上传功能
     * @param file  MultipartFile 用于接收二进制文件的对象
     * @return
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
        //file 就是源文件
        // 获取源文件 原始名字  9ec6fc2d-50d2-422e-b954-de87dcd04198.jpeg
        String originalFilename = file.getOriginalFilename();
        //    获取原始文件的名字
        //  根据原始名字 得到后缀名
        // 获取指定 字符 . 最后一次出现的索引
        int lastIndex = originalFilename.lastIndexOf(".");
        //  lastIndex . 最后一次位置
        // 截取 . 后面的所有内容
        String fileSuff = originalFilename.substring(lastIndex);
        String fileName= UUID.randomUUID().toString()+fileSuff;
        //    UUID.randomUUID().toString()
        //    32位+4个-的随机字符串(永不重复)
        // fileName 新的文件名
        // 为了保证每张图片名字不一样  文件名字随机+后缀名 = 新的文件名字
        File dir = new File(basePath);
        if(!dir.exists()){//该路径是否真实存在
            dir.mkdirs();//创建文件夹
        }

        // 是吧源文件的数据 存储到 服务器的硬盘上
        File uploadFile = new File(basePath,fileName);
                             //  父路径  文件名
        // 把接收到的file文件中的所有字节数据 转换到 uploadFile中
        try {
            file.transferTo(uploadFile);
        } catch (IOException e) {
            e.printStackTrace();

            return R.error("程序上传过程中遇到问题，请稍后重试");
        }


        return R.success(fileName);
    }

    /**
     * 响应 字节流给浏览器！！字节数据给浏览器
     *    不再是响应 R json格式对象。
     *    返回值写 void 告诉springmvc 这里不再响应 json字符串了。
     *    response.getOutputStream().write(字节)
     *    通过响应的字节输出流 ，把图片的字节数据 写出去 (浏览器上)
     *
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){
       log.info("正在进行文件下载，下载的文件名是:"+name);

        try {
            // 要下载的资源在服务器哪里
            File srcFile = new File(basePath, name);
            // srcFile 服务器硬盘上
            // 读取到服务器内存
            FileInputStream in = new FileInputStream(srcFile);
            // 最终写到浏览器  获取 程序通往浏览器的流
            ServletOutputStream out = response.getOutputStream();
            // in 服务器硬盘-服务器内存    out 服务器内存通向浏览器
            int len=0;
            byte[] buffer = new byte[8*1024];
            while((len=in.read(buffer))!=-1){
                out.write(buffer,0,len);
                //   读多少  写多少
            }
//            out.close(); reponse对象会关联
            in.close();

        } catch (IOException e) {
            e.printStackTrace();

        }


    }
}
